home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / hardware / azzam10 / mouse.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1994-10-31  |  9.0 KB  |  285 lines

  1. { ----------------------------------------------------------------- }
  2.                              UNIT Mouse;
  3. { -----------------------------------------------------------------
  4.  
  5.                  AzzaMouse v1.0 - last update 31/10/94
  6.                  -------------------------------------
  7.  
  8.  (c) Aaron ARDIRI, November 1994 - email : ardiriaj@cs.curtin.edu.au
  9.  
  10.    thus unit  has been written for the usage for possible graphics
  11.    that are available  through  the Turbo Pascal v5.0+ graph units
  12.    and BGI files.
  13.  
  14.     ( it was designed using the SVGA 1024x768, 256c resolution ).
  15.  
  16.   -----------------------------------------------------------------
  17.  
  18.     NB: please read the README.1st before using this unit for the
  19.         usual  crap about  copyright - and what is available, and
  20.         future upgrades etc...
  21.  
  22.   ----------------------------------------------------------------- }
  23.  
  24. { ----------------------------------------------------------------- }
  25.                              INTERFACE
  26. { ----------------------------------------------------------------- }
  27.  
  28. CONST
  29.   COMPort  = $03F8;
  30.   COMIntr  = $000C;
  31.  
  32.   ROMMSize  = 16;
  33.   ROMMouseI : ARRAY[ 0..(ROMMSize - 1), 0..(ROMMSize - 1) ] OF BYTE
  34.             = (
  35.                 ( 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 ),
  36.                 ( 00,00,00,00,00,00,15,15,15,15,00,00,00,00,00,00 ),
  37.                 ( 00,00,00,00,00,00,00,15,15,00,00,00,00,00,00,00 ),
  38.                 ( 00,00,00,00,00,00,00,15,15,00,00,00,00,00,00,00 ),
  39.                 ( 00,00,00,00,00,00,00,15,15,00,00,00,00,00,00,00 ),
  40.                 ( 00,00,00,00,00,00,15,15,15,15,00,00,00,00,00,00 ),
  41.                 ( 00,15,00,00,00,15,15,00,00,15,15,00,00,00,15,00 ),
  42.                 ( 00,15,15,15,15,15,00,00,00,00,15,15,15,15,15,00 ),
  43.                 ( 00,15,15,15,15,15,00,00,00,00,15,15,15,15,15,00 ),
  44.                 ( 00,15,00,00,00,15,15,00,00,15,15,00,00,00,15,00 ),
  45.                 ( 00,00,00,00,00,00,15,15,15,15,00,00,00,00,00,00 ),
  46.                 ( 00,00,00,00,00,00,00,15,15,00,00,00,00,00,00,00 ),
  47.                 ( 00,00,00,00,00,00,00,15,15,00,00,00,00,00,00,00 ),
  48.                 ( 00,00,00,00,00,00,00,15,15,00,00,00,00,00,00,00 ),
  49.                 ( 00,00,00,00,00,00,15,15,15,15,00,00,00,00,00,00 ),
  50.                 ( 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 )
  51.               );
  52.   ROMMouseM : ARRAY[ 0..(ROMMSize - 1), 0..(ROMMSize - 1) ] OF BYTE
  53.             = (
  54.                 ( 15,15,15,15,15,00,00,00,00,00,00,15,15,15,15,15 ),
  55.                 ( 15,15,15,15,15,00,00,00,00,00,00,15,15,15,15,15 ),
  56.                 ( 15,15,15,15,15,00,00,00,00,00,00,15,15,15,15,15 ),
  57.                 ( 15,15,15,15,15,15,00,00,00,00,15,15,15,15,15,15 ),
  58.                 ( 15,15,15,15,15,00,00,00,00,00,00,15,15,15,15,15 ),
  59.                 ( 00,00,00,15,00,00,00,00,00,00,00,00,15,00,00,00 ),
  60.                 ( 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 ),
  61.                 ( 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 ),
  62.                 ( 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 ),
  63.                 ( 00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00 ),
  64.                 ( 00,00,00,15,00,00,00,00,00,00,00,00,15,00,00,00 ),
  65.                 ( 15,15,15,15,15,00,00,00,00,00,00,15,15,15,15,15 ),
  66.                 ( 15,15,15,15,15,15,00,00,00,00,15,15,15,15,15,15 ),
  67.                 ( 15,15,15,15,15,00,00,00,00,00,00,15,15,15,15,15 ),
  68.                 ( 15,15,15,15,15,00,00,00,00,00,00,15,15,15,15,15 ),
  69.                 ( 15,15,15,15,15,00,00,00,00,00,00,15,15,15,15,15 )
  70.              );
  71.  
  72.   Vert     = 0;
  73.   Horz     = 1;
  74.  
  75. TYPE
  76.   MouseREC = RECORD
  77.                x, y       : INTEGER;
  78.                bmask      : INTEGER;
  79.                Moved      : BOOLEAN;
  80.                Visible    : BOOLEAN;
  81.  
  82.                Hotx, Hoty : BYTE;
  83.                minx, maxx : INTEGER;
  84.                miny, maxy : INTEGER;
  85.                Width,
  86.                Height     : BYTE;
  87.                MouseIPtr,
  88.                MouseMPtr,
  89.                MouseBPtr  : POINTER;
  90.              END;
  91.  
  92. VAR
  93.   MouseData  : MouseREC;
  94.  
  95.   MouseExist : BOOLEAN;
  96.  
  97.   PROCEDURE InitMouseDriver;
  98.   PROCEDURE KillMouseDriver;
  99.  
  100.   PROCEDURE ShowMouse;
  101.   PROCEDURE HideMouse;
  102.  
  103.   PROCEDURE SetMinMax( Dir : BYTE; Min, Max : INTEGER );
  104.   PROCEDURE SetMousePos( newx, newy : INTEGER );
  105.  
  106. { ----------------------------------------------------------------- }
  107.                            IMPLEMENTATION
  108. { ----------------------------------------------------------------- }
  109.  
  110. USES Dos, Graph, Drivers;
  111.  
  112. VAR
  113.   ByteNum  : BYTE;
  114.   COMBytes : ARRAY[ 0..2 ] OF BYTE;
  115.   OldMouse : PROCEDURE;
  116.  
  117.   PROCEDURE NewMouse; Interrupt;
  118.   VAR
  119.     dx, dy : SHORTINT;
  120.     inByte : BYTE;
  121.     b1, b2 : BOOLEAN;
  122.  
  123.   BEGIN
  124.     ASM CLI; END;
  125.  
  126.     MouseData.Moved := TRUE;
  127.  
  128.     IF MouseData.Visible
  129.       THEN PutImage( MouseData.x, MouseData.y, MouseData.MouseBPtr^, NormalPut );
  130.  
  131.     inByte := Port[COMport];
  132.     IF ( inByte AND 64 ) = 64 THEN ByteNum := 0;
  133.     COMBytes[ByteNum] := inByte;
  134.     ByteNum := ByteNum + 1;
  135.  
  136.     IF ( ByteNum = 3 )
  137.       THEN BEGIN
  138.              dx := ( COMBytes[0] AND 3 ) shl 6 + COMBytes[1];
  139.              dy := ( COMBytes[0] AND 12 ) shl 4 + COMBytes[2];
  140.  
  141.              WITH MouseData DO
  142.                BEGIN
  143.                  x := x + dx;
  144.                  y := y + dy;
  145.  
  146.                  IF y < Miny THEN y := Miny;
  147.                  IF y > ( Maxy - Height ) THEN y := ( Maxy - Width );
  148.                  IF x < Minx THEN x := MinX;
  149.                  IF x > ( Maxx - Width ) THEN x := ( Maxx - Width );
  150.  
  151.                  b1 := (( COMBytes[0] AND 32 ) <> 0);
  152.                  b2 := (( COMBytes[0] AND 16 ) <> 0);
  153.  
  154.                  bmask := (( ord(b1) * 2 ) + ord( b2 ));
  155.                END;
  156.              ByteNum := 0;
  157.            END;
  158.  
  159.     IF MouseData.Visible
  160.       THEN BEGIN
  161.              GetImage( MouseData.x, MouseData.y,
  162.                        MouseData.x + ( MouseData.Width - 1 ), MouseData.y + ( MouseData.Height - 1 ),
  163.                        MouseData.MouseBPtr^ );
  164.              PutImage( MouseData.x, MouseData.y, MouseData.MouseMPtr^, ANDPut );
  165.              PutImage( MouseData.x, MouseData.y, MouseData.MouseIPtr^, XORPut );
  166.            END;
  167.  
  168.     Port[$20] := $20;
  169.  
  170.     ASM STI; END;
  171.   END;
  172.  
  173.   PROCEDURE InitMouseDriver;
  174.   VAR
  175.     i, j : BYTE;
  176.  
  177.   BEGIN
  178.     FOR i := 0 TO ( ROMMSize - 1 ) DO
  179.       FOR j := 0 TO ( ROMMSize - 1 ) DO
  180.          PutPixel( i, j, ROMMouseI[ j, i ] );
  181.  
  182.     GetMem( MouseData.MouseIPtr, ImageSize( 0, 0, ( ROMMSize - 1 ), ( ROMMSize - 1 )));
  183.     GetImage( 0, 0, ( ROMMSize - 1 ), ( ROMMSize - 1 ), MouseData.MouseIPtr^ );
  184.  
  185.     FOR i := 0 TO ( ROMMSize - 1 ) DO
  186.       FOR j := 0 TO ( ROMMSize - 1 ) DO
  187.         IF ROMMouseM[ j, i ] <> 0
  188.           THEN PutPixel( i, j, 255 )
  189.           ELSE PutPixel( i, j, 0 );
  190.  
  191.     GetMem( MouseData.MouseMPtr, ImageSize( 0, 0, ( ROMMSize - 1 ), ( ROMMSize - 1 ) ));
  192.     GetImage( 0, 0, ( ROMMSize - 1 ), ( ROMMSize - 1 ), MouseData.MouseMPtr^ );
  193.  
  194.     GetMem( MouseData.MouseBPtr, ImageSize( 0, 0, ( ROMMSize - 1 ), ( ROMMSize - 1 ) ));
  195.     ClearViewPort;
  196.  
  197.     WITH MouseData DO
  198.       BEGIN
  199.         x := GetMaxX shr 1;
  200.         y := GetMaxY shr 1;
  201.  
  202.         minx := 0;
  203.         maxx := GetMaxX;
  204.         miny := 0;
  205.         maxy := GetMaxY;
  206.  
  207.         Hotx := 8;
  208.         Hoty := 8;
  209.  
  210.         Width := ROMMSize;
  211.         Height := ROMMSize;
  212.  
  213.         Visible := FALSE;
  214.         Moved := FALSE;
  215.       END;
  216.  
  217.     GetIntVec( COMintr, @OldMouse );
  218.     SetIntVec( COMintr, Addr( NewMouse ));
  219.   END;
  220.  
  221.   PROCEDURE KillMouseDriver;
  222.   BEGIN
  223.     SetIntVec( COMintr, @OldMouse );
  224.   END;
  225.  
  226.   PROCEDURE ShowMouse;
  227.   BEGIN
  228.     IF NOT MouseData.Visible
  229.       THEN BEGIN
  230.              GetImage( MouseData.x, MouseData.y,
  231.                        MouseData.x + ( MouseData.Width - 1 ), MouseData.y + ( MouseData.Height - 1 ),
  232.                        MouseData.MouseBPtr^ );
  233.              PutImage( MouseData.x, MouseData.y, MouseData.MouseMPtr^, ANDPut );
  234.              PutImage( MouseData.x, MouseData.y, MouseData.MouseIPtr^, XORPut );
  235.            END;
  236.  
  237.     MouseData.Visible := TRUE;
  238.   END;
  239.  
  240.   PROCEDURE HideMouse;
  241.   BEGIN
  242.     IF MouseData.Visible
  243.       THEN PutImage( MouseData.x, MouseData.y, MouseData.MouseBPtr^, NormalPut );
  244.  
  245.     MouseData.Visible := FALSE;
  246.   END;
  247.  
  248.   PROCEDURE SetMinMax( Dir : BYTE; Min, Max : INTEGER );
  249.   BEGIN
  250.     WITH MouseData DO
  251.       BEGIN
  252.         CASE Dir OF
  253.           Vert : BEGIN
  254.                    Miny := Min;
  255.                    Maxy := Max;
  256.                  END;
  257.           Horz : BEGIN
  258.                    Minx := Min;
  259.                    Maxx := Max;
  260.                  END;
  261.         END;
  262.       END;
  263.   END;
  264.  
  265.   PROCEDURE SetMousePos( newx, newy : INTEGER );
  266.   BEGIN
  267.     WITH MouseData DO
  268.       BEGIN
  269.         x := newx;
  270.         y := newy;
  271.       END;
  272.   END;
  273.  
  274. VAR
  275.   Regs : Registers;
  276.  
  277. BEGIN
  278.   FillChar( Regs, sizeof( Regs ), 0 );
  279.   WITH Regs DO
  280.     AX := 0;
  281.   Intr( $33, Regs );
  282.  
  283.   MouseExist := ( ButtonCount <> 0 );  { use Drivers auto detect }
  284. END.
  285.